home *** CD-ROM | disk | FTP | other *** search
/ Hottest 6 / Hottest 6 (1996)(PDSoft)[!].iso / software / programming / c / objective / examples / manx / demogfx.c < prev    next >
C/C++ Source or Header  |  1978-11-24  |  25KB  |  778 lines

  1. /*
  2. ** $Filename: demoGfx.c $
  3. ** $Release : 1.0       $
  4. ** $Revision: 1.260     $
  5. ** $Date    : 21/10/92  $
  6. **
  7. **
  8. ** (C) Copyright 1992 Davide Massarenti
  9. **              All Rights Reserved
  10. **
  11. ** MANX 5.2: cc -ps -wdrunpo -so <name>.c
  12. **           ln -o <name> <name>.o -lOGTglue -lc16
  13. **
  14. */
  15.  
  16. #include <OGT/ObjectiveGadTools.h>
  17.  
  18. #define ARGS_TEMPLATE "FILE/K,FONT/K,SIZE/N,SCANFONTS/S,DEMOSCROLL/S"
  19. #define ARGS_FILE       (0)
  20. #define ARGS_FONT       (1)
  21. #define ARGS_SIZE       (2)
  22. #define ARGS_SCANFONTS  (3)
  23. #define ARGS_DEMOSCROLL (4)
  24. #define ARGS_NUMOF      (5)
  25.  
  26. static LONG args[ ARGS_NUMOF ];
  27.  
  28.  
  29. static char Class_Button  [] = BUTTON_OGT_CLASS  ;
  30. static char Class_String  [] = STRING_OGT_CLASS  ;
  31. static char Class_Prop    [] = PROP_OGT_CLASS    ;
  32. static char Class_Scroller[] = SCROLLER_OGT_CLASS;
  33. static char Class_Showlist[] = SHOWLIST_OGT_CLASS;
  34.  
  35.  
  36. struct TextAttr  MyAttr = { NULL, 8 };
  37. struct TextFont *MyFont;
  38. struct Hook      ExtraRender;
  39.  
  40. APTR                     VInfo;
  41. struct Window           *Win;
  42. Object                 **Gads;
  43. struct RDArgs           *Ra;
  44. struct AvailFontsHeader *afh;
  45. LONG                     afSize;
  46.  
  47.  
  48. STRPTR Labels1[] =
  49. {
  50.    "1 OVI_GimmeZeroZero"    ,
  51.    "2 OVI_AdaptWidthToFont" ,
  52.    "3 OVI_AdaptHeightToFont",
  53.    "4 OGT_ScaleLeft"        ,
  54.    "5 OGT_ScaleTop"         ,
  55.    "6 OGT_ScaleWidth"       ,
  56.    "7 OGT_ScaleHeight"      ,
  57.    "8 OGT_DomainXscale"     ,
  58.    "9 OGT_DomainYscale"     ,
  59.    "10 WA_Activate"         ,
  60.    "11 WA_SimpleRefresh"    ,
  61.    "12 WA_NoCareRefresh"    ,
  62.    "13 WA_DepthGadget"      ,
  63.    "14 WA_SizeGadget"       ,
  64.    "15 WA_SizeBBottom"      ,
  65.    "16 WA_SizeBRight"       ,
  66.    "17 WA_DragBar"          ,
  67.    "18 WA_Left"             ,
  68.    "19 WA_Top"              ,
  69.    "20 WA_InnerWidth"       ,
  70.    "21 WA_InnerHeight"      ,
  71.    "22 WA_IDCMP"            ,
  72.    "23 WA_CloseGadget"      ,
  73.    "24 TAG_DONE"            ,              
  74.    NULL
  75. };
  76.  
  77. struct TagItem WindowDescTags[] =
  78. {
  79.    { OVI_GimmeZeroZero    , TRUE                                    },
  80.    { OVI_AdaptWidthToFont , TRUE                                    },
  81.    { OVI_AdaptHeightToFont, TRUE                                    },
  82.  
  83.    { OGT_ScaleLeft        , OGT_DomainRelative                      },
  84.    { OGT_ScaleTop         , OGT_DomainRelative                      },
  85.    { OGT_ScaleWidth       , OGT_DomainRelative                      },
  86.    { OGT_ScaleHeight      , OGT_DomainRelative                      },
  87.    { OGT_DomainXscale     , ~0                                      },
  88.    { OGT_DomainYscale     , ~0                                      },
  89.  
  90.    { WA_Activate          , TRUE                                    },
  91.    { WA_SmartRefresh      , TRUE                                    },
  92.    { WA_NoCareRefresh     , TRUE                                    },
  93.    { WA_DepthGadget       , TRUE                                    },
  94.    { WA_SizeGadget        , TRUE                                    },
  95.    { WA_SizeBBottom       , TRUE                                    },
  96.    { WA_SizeBRight        , TRUE                                    },
  97.    { WA_DragBar           , TRUE                                    },
  98.    { WA_Left              , 400                                     },
  99.    { WA_Top               , 150                                     },
  100.    { WA_InnerWidth        , 306                                     },
  101.    { WA_InnerHeight       , 120                                     },
  102.    { WA_MaxWidth          , -1                                      },
  103.    { WA_MaxHeight         , -1                                      },
  104.    { WA_IDCMP             , (IDCMP_CLOSEWINDOW | IDCMP_IDCMPUPDATE) },
  105.    { WA_CloseGadget       , TRUE                                    },
  106.  
  107.    { TAG_DONE                                                       },
  108. };
  109.  
  110. struct OGT_VectorElement Obj1Data[] =
  111. {
  112.    { 40  , 21  , OGTBU_Act_X_Scale|OGTBU_Act_Y_Scale },
  113.    {  0+1,  1+4, OGTBU_Act_Move|OGTBU_Act_StartFill  },
  114.    {  6+1,  7+4, OGTBU_Act_Draw|OGTBU_Act_Shadow     },
  115.    {  1+1, 12+4, OGTBU_Act_Draw                      },
  116.    {  1+1, 13+4, OGTBU_Act_Draw                      },
  117.    {  2+1, 14+4, OGTBU_Act_Draw                      },
  118.    {  7+1,  9+4, OGTBU_Act_Draw                      },
  119.    { 13+1, 15+4, OGTBU_Act_Draw                      },
  120.    { 14+1, 14+4, OGTBU_Act_Draw                      },
  121.    { 15+1, 14+4, OGTBU_Act_Draw                      },
  122.    {  9+1,  8+4, OGTBU_Act_Draw                      },
  123.    {  9+1,  7+4, OGTBU_Act_Draw                      },
  124.    { 13+1,  3+4, OGTBU_Act_Draw                      },
  125.    { 15+1,  2+4, OGTBU_Act_Draw                      },
  126.    { 18+1,  3+4, OGTBU_Act_Draw                      },
  127.    { 16+1,  0+4, OGTBU_Act_Draw                      },
  128.    { 14+1,  0+4, OGTBU_Act_Draw                      },
  129.    { 11+1,  2+4, OGTBU_Act_Draw                      },
  130.    {  8+1,  5+4, OGTBU_Act_Draw                      },
  131.    {  7+1,  5+4, OGTBU_Act_Draw                      },
  132.    {  2+1,  0+4, OGTBU_Act_Draw                      },
  133.    {  1+1,  0+4, OGTBU_Act_Draw|OGTBU_Act_EndFill    },
  134.    {  0+0,  1+2, OGTBU_Act_Move|OGTBU_Act_StartFill  },
  135.    {  6+0,  7+2, OGTBU_Act_Draw|OGTBU_Act_Shine      },
  136.    {  1+0, 12+2, OGTBU_Act_Draw                      },
  137.    {  1+0, 13+2, OGTBU_Act_Draw                      },
  138.    {  2+0, 14+2, OGTBU_Act_Draw                      },
  139.    {  7+0,  9+2, OGTBU_Act_Draw                      },
  140.    { 13+0, 15+2, OGTBU_Act_Draw                      },
  141.    { 14+0, 14+2, OGTBU_Act_Draw                      },
  142.    { 15+0, 14+2, OGTBU_Act_Draw                      },
  143.    {  9+0,  8+2, OGTBU_Act_Draw                      },
  144.    {  9+0,  7+2, OGTBU_Act_Draw                      },
  145.    { 13+0,  3+2, OGTBU_Act_Draw                      },
  146.    { 15+0,  2+2, OGTBU_Act_Draw                      },
  147.    { 18+0,  3+2, OGTBU_Act_Draw                      },
  148.    { 16+0,  0+2, OGTBU_Act_Draw                      },
  149.    { 14+0,  0+2, OGTBU_Act_Draw                      },
  150.    { 11+0,  2+2, OGTBU_Act_Draw                      },
  151.    {  8+0,  5+2, OGTBU_Act_Draw                      },
  152.    {  7+0,  5+2, OGTBU_Act_Draw                      },
  153.    {  2+0,  0+2, OGTBU_Act_Draw                      },
  154.    {  1+0,  0+2, OGTBU_Act_Draw|OGTBU_Act_Last       }
  155. };
  156.  
  157. struct OGT_VectorImage Obj1Shapes[] = { Obj1Data, Obj1Data, NULL, 4, -1, 80, 22, TRUE, TRUE };
  158.  
  159. struct TagItem Object1Desc[] = /* BUTTON_OGT_CLASS */
  160. {
  161.    { GA_ID            , 1                     },
  162.    { GA_RelVerify     , TRUE                  },
  163.  
  164.    { GA_Left          , 2                     },
  165.    { GA_Top           , 1                     },
  166.    { GA_Width         , 80                    },
  167.    { GA_Height        , 12                    },
  168.  
  169.    { GA_Text          , "_Cancel"             },
  170.    { OGT_TextPlacement, OGT_Text_IN_RIGHTMOST },
  171.    { OGTBU_VectorImage, Obj1Shapes            },
  172.    { OGT_AppGadget    , TRUE                  },
  173.  
  174.    { TAG_DONE                                 },
  175. };
  176.  
  177. struct TagItem Obj2toObj5[] =
  178. {
  179.    { OGTBU_ActiveLabel, PGA_Top },
  180.    { TAG_DONE                   }
  181. };
  182.  
  183. Tag Obj2toObj5Filter[] =
  184. {
  185.    OGTBU_ActiveLabel,
  186.    TAG_DONE
  187. };
  188.  
  189. struct TagItem Object2Desc[] = /* BUTTON_OGT_CLASS */
  190. {
  191.    { GA_ID            , 2                  },
  192.    { GA_RelVerify     , TRUE               },
  193.    { OGT_ClickRepeat  , TRUE               },
  194.  
  195.    { GA_Left          , 2                  },
  196.    { GA_Top           , 17                 },
  197.    { GA_Width         , 168                },
  198.    { GA_Height        , 14                 },
  199.  
  200.    { OGTBU_Labels     , Labels1            },
  201.  
  202.    { TAG_DONE                              },
  203. };
  204.  
  205. struct TagItem Obj3toObj2[] =
  206. {
  207.    { STRINGA_LongVal, OGTBU_ActiveLabel },
  208.    { TAG_DONE                           }
  209. };
  210.  
  211. Tag Obj3toObj2Filter[] =
  212. {
  213.    STRINGA_LongVal,
  214.    TAG_DONE
  215. };
  216.  
  217. struct TagItem Object3Desc[] = /* STRING_OGT_CLASS */
  218. {
  219.    { GA_ID            , 3                  },
  220.    { GA_RelVerify     , TRUE               },
  221.  
  222.    { GA_Left          , 88                 },
  223.    { GA_Top           , 1                  },
  224.    { GA_Width         , 96                 },
  225.    { GA_Height        , 14                 },
  226.  
  227.    { GA_Text          , "_String"          },
  228.    { OGT_TextPlacement, OGT_Text_RIGHT     },
  229.  
  230.    { STRINGA_MaxChars , 32                 },
  231.    { STRINGA_LongVal  , 10                 },
  232.    { STRINGA_ExitHelp , TRUE               },
  233.    { GA_TabCycle      , TRUE               },
  234.  
  235.    { TAG_DONE                              },
  236. };
  237.  
  238. struct TagItem Object4Desc[] = /* PROP_OGT_CLASS */
  239. {
  240.    { GA_ID              , 4                },
  241.    { GA_RelVerify       , TRUE             },
  242.  
  243.    { OGT_ScaleLeft      , OGT_FontRelative },
  244.    { OGT_SetPosReference, OGT_Y_Bottom     },
  245.    { GA_Left            , 46               },
  246.    { GA_Top             , -19              },
  247.    { GA_Width           , 96               },
  248.    { GA_Height          , 9                },
  249.  
  250.    { GA_Text            , "_HProp"         },
  251.    { OGT_TextPlacement  , OGT_Text_LEFT    },
  252.    { PGA_Top            , 10               },
  253.    { PGA_Visible        , 10               },
  254.    { PGA_Total          , 100              },
  255.    { PGA_Freedom        , FREEHORIZ        },
  256.  
  257.    { TAG_DONE                              },
  258. };
  259.  
  260. struct TagItem Obj5toObj3[] =
  261. {
  262.    { PGA_Top, STRINGA_LongVal },
  263.    { TAG_DONE                 }
  264. };
  265.  
  266. Tag Obj5toObj3Filter[] =
  267. {
  268.    PGA_Top ,
  269.    TAG_DONE
  270. };
  271.  
  272. struct TagItem Object5Desc[] = /* SCROLLER_OGT_CLASS */
  273. {
  274.    { GA_ID              , 5                },
  275.    { GA_RelVerify       , TRUE             },
  276.  
  277.    { OGT_ScaleLeft      , OGT_FontRelative },
  278.    { OGT_SetPosReference, OGT_Y_Bottom     },
  279.    { GA_Left            , 46               },
  280.    { GA_Top             , -9               },
  281.    { GA_Width           , 96               },
  282.    { GA_Height          , 9                },
  283.  
  284.    { GA_Text            , "_HScro"         },
  285.    { OGT_TextPlacement  , OGT_Text_LEFT    },
  286.  
  287.    { PGA_Top            , 10               },
  288.    { PGA_Visible        , 10               },
  289.    { PGA_Total          , 100              },
  290.    { PGA_Freedom        , FREEHORIZ        },
  291.  
  292.    { TAG_DONE                              },
  293. };
  294.  
  295. struct TagItem Object6Desc[] = /* PROP_OGT_CLASS */
  296. {
  297.    { GA_ID              , 6                            },
  298.    { GA_Immediate       , TRUE                         },
  299.    { GA_FollowMouse     , TRUE                         },
  300.    { GA_RelVerify       , TRUE                         },
  301.  
  302.    { OGT_SetPosReference, (OGT_X_Right | OGT_Y_Bottom) },
  303.    { GA_Left            , -81                          },
  304.    { GA_Top             , -52                          },
  305.    { GA_Width           , 16                           },
  306.    { GA_Height          , 51                           },
  307.  
  308.    { GA_Text            , "_VProp"                     },
  309.    { OGT_TextPlacement  , OGT_Text_ABOVE               },
  310.  
  311.    { PGA_Top            , 10                           },
  312.    { PGA_Visible        , 10                           },
  313.    { PGA_Total          , 100                          },
  314.    { PGA_Freedom        , FREEVERT                     },
  315.  
  316.    { TAG_DONE                                          },
  317. };
  318.  
  319. struct TagItem Object7Desc[] = /* SCROLLER_OGT_CLASS */
  320. {
  321.    { GA_ID              , 7                            },
  322.    { GA_RelVerify       , TRUE                         },
  323.  
  324.    { OGT_SetPosReference, (OGT_X_Right | OGT_Y_Bottom) },
  325.    { GA_Left            , -33                          },
  326.    { GA_Top             , -52                          },
  327.    { GA_Width           , 16                           },
  328.    { GA_Height          , 51                           },
  329.  
  330.    { GA_Text            , "_VScro"                     },
  331.    { OGT_TextPlacement  , OGT_Text_ABOVE               },
  332.  
  333.    { PGA_Top            , 10                           },
  334.    { PGA_Visible        , 10                           },
  335.    { PGA_Total          , 100                          },
  336.    { PGA_Freedom        , FREEVERT                     },
  337.  
  338.    { TAG_DONE                                          },
  339. };
  340.  
  341.  
  342. struct TagItem Obj8toObj10[] =
  343. {
  344.    { PGA_Top , OGTSL_VertPos },
  345.    { TAG_DONE                }
  346. };
  347.  
  348. struct TagItem Object8Desc[] = /* SCROLLER_OGT_CLASS */
  349. {
  350.    { GA_ID              , 8                                         },
  351.    { GA_Immediate       , TRUE                                      },
  352.    { GA_FollowMouse     , TRUE                                      },
  353.    { GA_RelVerify       , TRUE                                      },
  354.  
  355.    { OGT_SetDimReference, (OGT_X_Dim_Relative | OGT_Y_Dim_Relative) },
  356.    { GA_RightBorder     , TRUE                                      },
  357.  
  358.    { PGA_Freedom        , FREEVERT                                  },
  359.    { PGA_Top            , 0                                         },
  360.    { PGA_Visible        , 0                                         },
  361.    { PGA_Total          , 0                                         },
  362.  
  363.    { TAG_DONE                                                       },
  364. };
  365.  
  366.  
  367. struct TagItem Obj9toObj10[] =
  368. {
  369.    { PGA_Top , OGTSL_HoriPos },
  370.    { TAG_DONE                }
  371. };
  372.  
  373. struct TagItem Object9Desc[] = /* SCROLLER_OGT_CLASS */
  374. {
  375.    { GA_ID              , 9                                         },
  376.    { GA_Immediate       , TRUE                                      },
  377.    { GA_FollowMouse     , TRUE                                      },
  378.    { GA_RelVerify       , TRUE                                      },
  379.  
  380.    { OGT_SetDimReference, (OGT_X_Dim_Relative | OGT_Y_Dim_Relative) },
  381.    { GA_BottomBorder    , TRUE                                      },
  382.  
  383.    { PGA_Freedom        , FREEHORIZ                                 },
  384.    { PGA_Top            , 0                                         },
  385.    { PGA_Visible        , 0                                         },
  386.    { PGA_Total          , 0                                         },
  387.  
  388.    { TAG_DONE                                                       },
  389. };
  390.  
  391.  
  392. struct TagItem Obj10toObj8[] =
  393. {
  394.    { OGTSL_VertPos    , PGA_Top     },
  395.    { OGTSL_VertTotal  , PGA_Total   },
  396.    { OGTSL_VertVisible, PGA_Visible },
  397.    { TAG_DONE                       }
  398. };
  399.  
  400. Tag Obj10toObj8Filter[] =
  401. {
  402.    OGTSL_VertPos    ,
  403.    OGTSL_VertTotal  ,
  404.    OGTSL_VertVisible,
  405.    TAG_DONE
  406. };
  407.  
  408. struct TagItem Obj10toObj9[] =
  409. {
  410.    { OGTSL_HoriPos    , PGA_Top     },
  411.    { OGTSL_HoriTotal  , PGA_Total   },
  412.    { OGTSL_HoriVisible, PGA_Visible },
  413.    { TAG_DONE                       }
  414. };
  415.  
  416. Tag Obj10toObj9Filter[] =
  417. {
  418.    OGTSL_HoriPos    ,
  419.    OGTSL_HoriTotal  ,
  420.    OGTSL_HoriVisible,
  421.    TAG_DONE
  422. };
  423.  
  424. struct TagItem Object10Desc[] = /* SHOWLIST_OGT_CLASS */
  425. {
  426.    { GA_ID                 , 10              },
  427.    { GA_Immediate          , TRUE            },
  428.    { GA_FollowMouse        , TRUE            },
  429.    { GA_RelVerify          , TRUE            },
  430.  
  431.    { GA_Left               , 2               },
  432.    { GA_Top                , 33              },
  433.    { GA_Width              , 168             },
  434.    { GA_Height             , 66              },
  435.  
  436.    { GA_Text               , "_List"         },
  437.    { OGT_TextPlacement     , OGT_Text_RIGHT  },
  438.  
  439.    { OGTSL_ExtraRendering  , &ExtraRender    },
  440.  
  441.    { TAG_DONE                                },
  442. };
  443.  
  444. struct TagItem Object10Post[] =
  445. {
  446.    { OGTSL_FileToLoadByName },
  447.    { TAG_DONE               }
  448. };
  449.  
  450. struct OGT_ObjectSettings ListOfObjects[] =
  451. {
  452.    { Class_Button  , Object1Desc , NULL        , OGT_NOOBJECT, OGT_NOOBJECT },
  453.    { Class_Button  , Object2Desc , NULL        , OGT_NOOBJECT, OGT_NOOBJECT },
  454.    { Class_String  , Object3Desc , NULL        , OGT_NOOBJECT, OGT_NOOBJECT },
  455.    { Class_Prop    , Object4Desc , NULL        , OGT_NOOBJECT, OGT_NOOBJECT },
  456.    { Class_Scroller, Object5Desc , NULL        , OGT_NOOBJECT, OGT_NOOBJECT },
  457.    { Class_Prop    , Object6Desc , NULL        , OGT_NOOBJECT, OGT_NOOBJECT },
  458.    { Class_Scroller, Object7Desc , NULL        , OGT_NOOBJECT, OGT_NOOBJECT },
  459.    { Class_Scroller, Object8Desc , NULL        , OGT_NOOBJECT, OGT_NOOBJECT },
  460.    { Class_Scroller, Object9Desc , NULL        , OGT_NOOBJECT, OGT_NOOBJECT },
  461.    { Class_Showlist, Object10Desc, Object10Post, OGT_NOOBJECT, OGT_NOOBJECT },
  462.    { NULL                                                                   },
  463.    { Class_Showlist, Object10Desc, NULL        , OGT_NOOBJECT, OGT_NOOBJECT },
  464. };
  465.  
  466. struct OGT_ObjectLink ListOfLinks[] =
  467. {
  468.    { 1           , 4, Obj2toObj5 , Obj2toObj5Filter  },
  469.    { 2           , 1, Obj3toObj2 , Obj3toObj2Filter  },
  470.    { 4           , 2, Obj5toObj3 , Obj5toObj3Filter  },
  471.    { 9           , 7, Obj10toObj8, Obj10toObj8Filter },
  472.    { 9           , 8, Obj10toObj9, Obj10toObj9Filter },
  473.    { 7           , 9, Obj8toObj10                    },
  474.    { 8           , 9, Obj9toObj10                    },
  475.    { OGT_NOOBJECT                                    },
  476. };
  477.  
  478. static void cleanup           ( char *str );
  479. static void goHandleWindowWait( void      );
  480. static BOOL goHandleWindow    ( void      );
  481.  
  482.  
  483. static ULONG ExtraDrawing( struct Hook                 *hook ,
  484.                            Object                      *o    ,
  485.                            struct ogmsl_ExtraRendering *msg  )
  486. {
  487.    struct RastPort *rp = msg->ogmsl_RPort;
  488.    LONG             x  = msg->ogmsl_Domain.Left - msg->ogmsl_TextScrollLeft;
  489.    LONG             y  = msg->ogmsl_Domain.Top  - msg->ogmsl_TextScrollTop ;
  490.  
  491.    if(msg->ogmsl_AfterText)
  492.    {
  493.       SetAPen( rp,   3              );
  494.       Move   ( rp,   0 + x,   0 + y );
  495.       Draw   ( rp, 400 + x, 300 + y );
  496.  
  497.       {
  498.          struct IBox box;
  499.  
  500.          box.Left   = 100 + x;
  501.          box.Top    = 100 + y;
  502.          box.Width  = 100;
  503.          box.Height = 100;
  504.  
  505.          OGT_DrawVectorImage( rp, NULL, &box, Obj1Data );
  506.       }
  507.    }
  508.    else
  509.    {
  510.       {
  511.          struct ogmsl_Node *ptr = OGT_GetANode( msg->ogmsl_Nodes, 7 );
  512.  
  513.          if(ptr) ptr->ogmsl_Flags = ogmsl_Flags_ReverseColors;
  514.       }
  515.  
  516.       SetAPen    ( rp,   2                        );
  517.       Move       ( rp, 200 + x,   0 + y           );
  518.       Draw       ( rp,   0 + x, 600 + y           );
  519.       DrawEllipse( rp, 400 + x, 300 + y, 100, 140 );
  520.    }
  521.  
  522.  
  523.    return( TRUE );
  524. }
  525.  
  526. void main( void )
  527. {
  528.    struct AvailFonts *af;
  529.    LONG               afShortage;
  530.  
  531.    if(!OpenOGT()) cleanup( "no objectivegadtools library\n" );
  532.  
  533.    if(!(Ra = ReadArgs( ARGS_TEMPLATE, args, NULL ))) cleanup( "can't parse args\n" );
  534.  
  535.    if(args[ ARGS_SCANFONTS ])
  536.    {
  537.       afSize = 10000;
  538.  
  539.       do
  540.       {
  541.          if(afh = (struct AvailFontsHeader *)AllocMem( afSize, 0 ))
  542.          {
  543.             if(afShortage = AvailFonts( afh, afSize, AFF_DISK ))
  544.             {
  545.                FreeMem( afh, afSize );
  546.  
  547.                afSize += afShortage;
  548.             }
  549.          }
  550.          else
  551.          {
  552.             break;
  553.          }
  554.  
  555.       } while(afShortage);
  556.  
  557.       if(!afh) cleanup( "can't scan fonts!\n" );
  558.  
  559.       af = (struct AvailFonts *)(&afh->afh_NumEntries + 1);
  560.    }
  561.    else
  562.    {
  563.       if(args[ ARGS_FONT ]) MyAttr.ta_Name  =  (void  *)args[ ARGS_FONT ];
  564.       if(args[ ARGS_SIZE ]) MyAttr.ta_YSize = *(ULONG *)args[ ARGS_SIZE ];
  565.  
  566.       if(MyAttr.ta_Name)
  567.       {
  568.          if(!(MyFont = OpenDiskFont( &MyAttr ))) cleanup( "can't open font!!\n" );
  569.       }
  570.    }
  571.  
  572.    ExtraRender.h_Entry    = hookEntry;
  573.    ExtraRender.h_SubEntry = ExtraDrawing;
  574.  
  575.    while(1)
  576.    {
  577.       STRPTR title = "Prova";
  578.  
  579.       if(args[ ARGS_SCANFONTS ])
  580.       {
  581.          if(!afh->afh_NumEntries) break;
  582.  
  583.          if(!(MyFont = OpenDiskFont( &af->af_Attr ))) cleanup( "can't open font!!\n" );
  584.  
  585.          title = af->af_Attr.ta_Name;
  586.       }
  587.  
  588.       VInfo = OGT_GetVisualInfo( NULL, OGT_TextFont, (ULONG)MyFont         ,
  589.                                        WA_Title    , (ULONG)title          ,
  590.                                        TAG_MORE    , (ULONG)WindowDescTags );
  591.  
  592.       if(VInfo == NULL) cleanup( "can't open my window.\n" );
  593.  
  594.       Object10Post[ 0 ].ti_Data = args[ ARGS_FILE ];
  595.  
  596.       if(!OGT_BuildObjects( VInfo, ListOfObjects, ListOfLinks, &Gads )) cleanup( "can't create objects" );
  597.  
  598.       Win = OGT_GetWindowPtr( VInfo );
  599.  
  600.       {
  601.          if(args[ ARGS_SCANFONTS ])
  602.          {
  603.             Delay( 50 );
  604.  
  605.             if(!goHandleWindow()) break;
  606.          }
  607.          else
  608.          {
  609.             goHandleWindowWait();
  610.          }
  611.  
  612.          while(args[ ARGS_DEMOSCROLL ])
  613.          {
  614.             SHORT i = 0;
  615.  
  616.             while(i < 50)
  617.             {
  618.                SetGadgetAttrs( Gads[ 9 ], Win, NULL, OGTSL_HoriPos, (ULONG)i++, TAG_DONE );
  619.  
  620.                if(!goHandleWindow()) break;
  621.             }
  622.  
  623.             if(i != 50 ) break;
  624.  
  625.             while(i >  0)
  626.             {
  627.                SetGadgetAttrs( Gads[ 9 ], Win, NULL, OGTSL_HoriPos, (ULONG)i--, TAG_DONE );
  628.  
  629.                if(!goHandleWindow()) break;
  630.             }
  631.  
  632.             if(i != 0) break;
  633.          }
  634.       }
  635.  
  636.       if(args[ ARGS_SCANFONTS ])
  637.       {
  638.          if(VInfo ) { OGT_FreeVisualInfo( VInfo  ); VInfo  = NULL; }
  639.          if(MyFont) { CloseFont         ( MyFont ); MyFont = NULL; }
  640.  
  641.          af++; afh->afh_NumEntries--;
  642.  
  643.          continue;
  644.       }
  645.  
  646.       break;
  647.    }
  648.  
  649.    cleanup( "all done" );
  650. }
  651.  
  652. static void cleanup( char *str )
  653. {
  654.    if(str) Printf( "%s\n", str );
  655.  
  656.    if(afh   ) FreeMem           ( afh, afSize );
  657.    if(Ra    ) FreeArgs          ( Ra          );
  658.    if(Gads  ) FreeVec           ( Gads        );
  659.    if(VInfo ) OGT_FreeVisualInfo( VInfo       );
  660.    if(MyFont) CloseFont         ( MyFont      );
  661.  
  662.    CloseOGT();
  663.  
  664.    Exit( 0 );
  665. }
  666.  
  667. static void goHandleWindowWait( void )
  668. {
  669.    BOOL keeprunning = TRUE;
  670.  
  671.    while(keeprunning)
  672.    {
  673.       Wait( 1L << Win->UserPort->mp_SigBit );
  674.  
  675.       keeprunning = goHandleWindow();
  676.    }
  677. }
  678.  
  679. static BOOL goHandleWindow( void )
  680. {
  681.    BOOL                 keeprunning = TRUE;
  682.  
  683.    struct IntuiMessage *imsg;
  684.  
  685.    while(keeprunning && (imsg = OGT_GetMsg( VInfo )))
  686.    {
  687.       switch(imsg->Class)
  688.       {
  689.          case IDCMP_CLOSEWINDOW:
  690.             keeprunning = FALSE;
  691.             break;
  692.  
  693.          case IDCMP_IDCMPUPDATE:
  694.             {
  695.                struct TagItem *tags = imsg->IAddress;
  696.  
  697.                switch( GetTagData( OGT_ID, -1, tags ) )
  698.                {
  699.                   case 10: /* SHOWLIST */
  700.                      {
  701.                         static LONG        last_num    = -1;
  702.                         static BOOL        last_status = FALSE;
  703.  
  704.                         LONG               num         = GetTagData( OGTSL_HitLabelNumFromList, -1, tags );
  705.  
  706.                         struct MinList    *list;
  707.                         struct ogmsl_Node *ptr;
  708.  
  709.                         SetGadgetAttrs( Gads[ 9 ], Win, NULL, OGTSL_LockList, (ULONG)TRUE, TAG_DONE );
  710.  
  711.                         if(GetAttr( OGTSL_ListOfLabels, Gads[ 9 ], &list ))
  712.                         {
  713.                            if(GetTagData( OGT_GadgetDown, FALSE, tags ))
  714.                            {
  715.                               if(last_num != -1 && last_status)
  716.                               {
  717.                                  if(ptr = OGT_GetANode( list, last_num ))
  718.                                  {
  719.                                     ptr->ogmsl_Flags |=  ogmsl_Flags_Modified;
  720.                                     ptr->ogmsl_Flags &= ~ogmsl_Flags_ReverseColors;
  721.                                  }
  722.                               }                                 
  723.  
  724.                               last_num    = num;
  725.                               last_status = TRUE;
  726.  
  727.                               if(ptr = OGT_GetANode( list, last_num ))
  728.                               {
  729.                                  ptr->ogmsl_Flags |= ogmsl_Flags_Modified;
  730.                                  ptr->ogmsl_Flags |= ogmsl_Flags_ReverseColors;
  731.                               }
  732.                               else
  733.                               {
  734.                                  last_num = -1;
  735.                               }
  736.                            }
  737.  
  738.                            if(GetTagData( OGT_GadgetMove, FALSE, tags ) && last_num != -1)
  739.                            {
  740.                               if(ptr = OGT_GetANode( list, last_num ))
  741.                               {
  742.                                  if(( last_status && last_num != num) ||
  743.                                     (!last_status && last_num == num)  )
  744.                                  {
  745.                                     ptr->ogmsl_Flags |= ogmsl_Flags_Modified;
  746.                                     ptr->ogmsl_Flags ^= ogmsl_Flags_ReverseColors;
  747.                                     last_status       = TRUE - last_status;
  748.                                  }
  749.                               }
  750.                            }
  751.  
  752.                            if(GetTagData( OGT_GadgetUp, FALSE, tags ))
  753.                            {
  754.                               if(ptr = OGT_GetANode( list, last_num ))
  755.                               {
  756.                                  ptr->ogmsl_Flags |=  ogmsl_Flags_Modified;
  757.                                  ptr->ogmsl_Flags &= ~ogmsl_Flags_ReverseColors;
  758.                               }
  759.  
  760.                               last_num = -1;
  761.                            }
  762.                         }
  763.  
  764.                         SetGadgetAttrs( Gads[ 9 ], Win, NULL, OGTSL_LockList, (ULONG)FALSE, TAG_DONE );
  765.                      }
  766.                      break;
  767.                }
  768.             }
  769.                         
  770.             break;
  771.       }
  772.  
  773.       OGT_ReplyMsg( imsg );
  774.    }
  775.  
  776.    return( keeprunning );
  777. }
  778.